﻿Imports System.Threading
Imports System
Imports Microsoft.Win32
Imports System.Collections.Generic
Imports System.Net.Dns




Public Class Aplicativo
    Implements IComparable(Of Aplicativo)
    Implements IEquatable(Of Aplicativo)

    Private _nome As String
    Private _versao As String
    Public Instalacao As List(Of Passo_Instalacao)

    Public Function CompareTo(ByVal other As Aplicativo) As Integer Implements IComparable(Of Aplicativo).CompareTo
        If Nome.CompareTo(other.Nome) = 0 Then
            Return Versao.CompareTo(other.Versao)
        Else
            Return Nome.CompareTo(other.Nome)
        End If
    End Function

    Public Overloads Function Equals(ByVal app As Aplicativo) As Boolean Implements IEquatable(Of Aplicativo).Equals

        If Me.CompareTo(app) = 0 Then
            Return True
        Else
            Return False
        End If

    End Function


    Public Sub New(ByVal nome As String, ByVal versao As String)
        Me.Nome = nome
        Me.Versao = versao
        Me.Instalacao = New List(Of Passo_Instalacao)
    End Sub

    Public Sub New()
        Me.Nome = "teste"
        Me.Versao = "teste"
    End Sub

    Public Property Nome() As String
        Get
            Return _nome
        End Get
        Set(ByVal Valor As String)
            _nome = Valor
        End Set
    End Property

    Public Property Versao() As String
        Get
            Return _versao
        End Get
        Set(ByVal Valor As String)
            _versao = Valor
        End Set
    End Property

    Public Shadows Function ToString() As String
        Return Nome + " - " + Versao
    End Function

    Public Shared Function MontarLista() As List(Of Aplicativo)
        Dim Aplicativos As New List(Of Aplicativo)
        Dim appName, appVersion As String
        Dim i As Integer

        'Chave do registro do Windows referente à máquina local
        Dim regKey As RegistryKey = Registry.LocalMachine

        'Chave onde são encontradas todas as informações dos programas instalados no computador
        regKey = regKey.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall")

        'Obtém a relação de subchaves em um vetor do tipo string
        'Cada elemento do vetor retornado aponta para o nome de uma chave de um programa instalado
        Dim keys() As String = regKey.GetSubKeyNames()

        'Verifica se o vetor retornado é válido
        If (Not (keys Is Nothing)) And keys.Length > 0 Then

            'Percorre todo o vetor de chaves para obter o nome de exibição (DisplayName) de cada programa instalado
            For i = 0 To keys.Length - 1 Step 1
                'Abre a subchave atual do vetor
                Dim k As RegistryKey = regKey.OpenSubKey(keys(i))

                'Este bloco try-catch evita que o programa aborte caso a subchave não possua uma valor DisplayName
                Try
                    'Obtém o valor DisplayName (nome de exibição do programa) da subchave atual
                    appName = k.GetValue("DisplayName").ToString()

                Catch ex As Exception
                    'Em caso de exceção não faz nada, apenas continua a varrer o vetor de subchaves
                    appName = ""
                End Try


                'Este bloco try-catch evita que o programa aborte caso a subchave não possua uma valor DisplayVersion
                Try
                    'Obtém o valor DisplayVersion (nome de exibição do programa) da subchave atual
                    appVersion = k.GetValue("DisplayVersion").ToString()

                Catch ex As Exception
                    'Em caso de exceção insere "vazio" no item
                    appVersion = ""
                End Try

                If (((Not (appVersion Is Nothing)) And (appVersion.Length > 0)) Or ((Not (appName Is Nothing)) And (appName.Length > 0))) Then
                    Aplicativos.Add(New Aplicativo(appName, appVersion))
                End If
            Next

        End If

        'Ordena os valores
        Aplicativos.Sort()
        Return Aplicativos

    End Function

    Public Function Instalar(ByVal c As Cliente) As Boolean

        Try
            Me.Montar_lista_instalacao()

            Dim p As Passo_Instalacao

            For Each p In Instalacao
                Select Case p.Comando.Substring(0, 4)
                    Case "copy"
                        Dim ta As New sigeapDataSetTableAdapters.ConfiguracoesTableAdapter
                        Dim repositorio As String

                        repositorio = ta.getRepositorio

                        Comunicacao.EnviarMensagem(c, "3\\" + GetHostName() + "\" + repositorio + "\" + p.Comando.Substring(5, p.Comando.Length - 5), True)

                    Case Else
                        Comunicacao.EnviarMensagem(c, "2" + p.Comando, True)

                        Thread.Sleep(100)

                End Select
            Next
            Return True
        Catch ex As Exception
            Return False
        End Try

    End Function

    Private Sub Montar_lista_instalacao()
        Dim ta As New sigeapDataSetTableAdapters.Passos_InstalacaoTableAdapter
        Dim ds As New sigeapDataSet
        Dim p As sigeapDataSet.Passos_InstalacaoRow

        ta.FillByAplicativo(ds.Passos_Instalacao, Me.Nome, Me.Versao)

        For Each p In ds.Passos_Instalacao

            Dim passo As Passo_Instalacao
            passo = New Passo_Instalacao(p.ID, p.Comando)
            Instalacao.Add(passo)

        Next

        Instalacao.Sort()

    End Sub

End Class
